perm filename SUMNER.MF[MF,DEK]1 blob sn#745094 filedate 1984-03-09 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	% macros that may go into PLAIN.MF some day
C00006 00003	% setting up the font parameters
C00008 00004	% font initialization
C00010 00005	"The letter A"
C00011 00006	end
C00012 ENDMK
CāŠ—;
% macros that may go into PLAIN.MF some day

delimiters ();
epsilon=.00001;		% METAFONT's smallest positive number

vardef round primary x = trunc(x+.5) enddef;

numeric displaying;	% if > 0, displays after each character;
			% if > 1, displays after each fil, etc.
boolean makingfont;	% true if outputting to GF file.

def beginchar (expr code, units, point_height, point_depth) =
	begincharacter
	charcode=code;
	charht=point_height;
	chardp=point_depth;
	numeric u,r;
	r=round(units*pu*ppp-1)=units*u;
	charwd=units*pu; chardw=r+1;
	edges ee;
	numeric labelchar; labelchar=ord"a"-1;
	if displaying>0:
		openwindow cur_window from NWcorner to SEcorner at topleftpoint; fi
	enddef;

def endchar = 
	if displaying>0: display_ee; fi
	if makingfont: shipout ee; fi
	endcharacter
	enddef;

outer beginchar, endchar;

def fil expr x =
	addto ee weighted 1 contour x;
	everydraw;
	enddef;

def plain_everydraw =
	if displaying>1: display_ee; fi
	enddef;
let everydraw=plain_everydraw;

def display_ee =
	display ee onwindow cur_window
	enddef;

numeric cur_window, window_counter;
window_counter=16;
vardef newwindow =
	begingroup
	if window_counter>0: window_counter:=window_counter-1;
	else: errmessage("All windows are already taken"); fi
	window_counter endgroup
	enddef;
cur_window:=newwindow;

vardef z@# = (x@#,y@#) enddef;
vardef zz@# = (xx@#,yy@#) enddef;

def penpos(suffix i)(expr length,theta)=
	z.i.r-z.i.l = (length,0) rotated theta;
	z.i = .5[z.i.l, z.i.r] enddef;

def penstroke(suffix i,j)(expr lambda,rho,alpha)=
	begingroup save xx,yy;
	zz.mid=alpha[z.i,z.j];
	zz.l=alpha[z.i.l,z.j.l]; zz.r=alpha[z.i.r,z.j.r];
	zz.mid.l=lambda[zz.l,zz]; zz.mid.r=rho[zz.r,zz];
	fil z.i.l .. z.i.r
	 & z.i.r{zz.mid-z.i.r} .. z.mid.r{z.j.r-z.i.r} .. z.j.r{z.j.r-zz.mid}
	 & z.j.r .. z.j.l
	 & z.j.l{zz.mid-z.j.l} .. z.mid.l{z.i.l-z.j.l} .. z.i.l{z.i.l-zz.mid}
	 & cycle;
	labelchar:=labelchar+1; threelabels (char labelchar, zz.mid);
	endgroup enddef;

def threelabels(expr s)(text z)=
	autolabel z as s; autolabel z.l as s&"L"; autolabel z.r as s&"R"
	enddef;

def penlabels(text suffixes)=
	forsuffixes $=suffixes: threelabels(string$,z$) endfor enddef;

def isbetween(expr u,v)=
	collinearop u=alpha*(v-u); endgroup enddef;

primarydef z collinearop u =
	begingroup save alpha; z-u enddef;	% watch out, that was tricky
% setting up the font parameters

def atypi_parameters=
	size=10;		% design size, in points
	u.pts=26/36;		% unit width, in points
	H.pts=250/36;		% cap height, in points
	thin.pts=22/36;		% narrow pen width, in points
	thick.pts=44/36;	% wide pen width, in points
	aspect=.85;		% aspect ratio, in points
	cut=15;			% cut angle at baseline, in degrees
	gap=1;			% gap amount, in relative units
	tau=0.4;		% taper parameter
	enddef

def atypi_setup=
	numeric tau[]; tau.low=tau*tau; tau.high=sqrt tau; tau.med.low=tau*tau2;
	numeric thin, thick, H;
	pair topleftpoint;
	thin=round(ppp*thin.pts+blacker);
	thick=round(ppp*thick.pts+blacker);
	H=round(ppp*H.pts);
	topleftpoint=(-2u,1.3H);
	enddef

message "Please type a mode, followed by options like magnification, etc.";
message "mode="; readterminal getoptions;
mode=getoptions;
% font initialization

proof=0; lowres=1; dover=2; canon=3; smoke=4;	% symbolic names of modes


step0.5=sqrt 1.2; step1=1.2; step2=1.44; step3=1.728; step4=2.0736; step5=2.48832;
if unknown mag: mag:=1; fi

if mode=proof: proofmode:=1; displaying:=2; tracingtitles:=1; labelling:=1;
	makingfont:=false;
	ppp=36*mag; blacker=0; overcorr=1;	% for initial design of characters
elseif mode=lowres: makingfont:=true;
	ppp=(200/72.27)*mag; blacker=.65; overcorr=.4;	% XGP, etc.
elseif mode=dover: makingfont:=true;
	ppp=(384/72.27)*mag; blacker=1.2; overcorr=.6; % Xerox Dover
elseif mode=canon: makingfont:=true;
	ppp=(240/72.27)*mag; blacker=.65; overcorr=.4;	% XGP, etc.
elseif mode=smoke: proofmode:=1; tracingtitles:=1; displaying:=1;
	makingfont:=false;
	ppp=72; blacker=0; overcorr=1;			% "smoke proofs"
else: input mode;
fi;

pair NWcorner,SEcorner;

atypi_parameters;
atypi_setup;
designsize:=size;
NWcorner=(0,0); SEcorner=(10000,10000);
"The letter A";
beginchar(ord"A", 13, 1.1H.pts, 0);
y1=0;		x1l=.5u;		penpos(1,-cut-45,thin);
y4=0;		x4r=r-.5u;		penpos(4,cut+15,thick);
z2=(.5r,1.1H);				penpos(2,cut+25,thick);
y3=H;	z3 isbetween (z2,z4);	penpos(3,cut+15,2/3[thin,thick]);
y5r=y6r=3/7H;	penpos(5,45,aspect*thin);
		penpos(6,135,aspect*thin);
z5+(gap*u+.5thin,0) isbetween (z1,z3);
z6+(gap*u+.5thick,0) isbetween (z2,z4);
penstroke(2,4,tau.low,tau,.45);		% right diagonal
penstroke(3,1,tau.high,tau.med.low,.6);	% left diagonal
penstroke(5,6,0,0,.5);			% bar line
penlabels 1,2,3,4,5,6;
endchar;
end

% Note, a devious thing to try:
let begin_char=beginchar;
let end_char=endchar;
let semicolon=;;
def beginchar=
	let endchar=quote enddef;
	let ;=finishup semicolon
	def chartext = beginchar enddef;
def finishup=
	let ;=semicolon;
	let endchar=end_char;
	let beginchar=begin_char enddef;